#include "button.h"


// 全局变量, 消息队列, 用户中断到任务的数据传输
QueueHandle_t gpio_evt_queue = NULL;


// 中断回调函数
static void IRAM_ATTR gpio_isr_handler(void* arg)
{
    uint32_t gpio_num = (uint32_t) arg;
    // 往队列中写入产生中断的gpio引脚号
    xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
}

// gpio初始化
void button_init(void)
{
    gpio_config_t io_conf = {};
    //设置IO引脚：宏定义中修改
    io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL;
    //设置IO方向：输入
    io_conf.mode = GPIO_MODE_INPUT;
    //设置IO上拉：使能
    io_conf.pull_up_en = 1;
    //设置IO中断类型：上升沿中断
    io_conf.intr_type = GPIO_INTR_ANYEDGE;
    //配置GPIO
    gpio_config(&io_conf);

    //安装GPIO中断服务
    gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);
    //添加GPIO_INPUT_IO_0中断回调函数
    gpio_isr_handler_add(GPIO_INPUT_BOOT, gpio_isr_handler, (void*) GPIO_INPUT_BOOT);
    //添加GPIO_INPUT_IO_1中断回调函数
    gpio_isr_handler_add(GPIO_INPUT_EXTER, gpio_isr_handler, (void*) GPIO_INPUT_EXTER);
    
    //创建1个队列，队列长度为10，队列项为uint32_t
    gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));
}